<?php

class CargaCuponesDevueltosTest extends MY_Controller {

    function __construct() {
        parent::__construct();
    }

    /*
     * index() se ejecuta por defecto al ser cargado del controlador
     */

    public function index() {
        
        
            $i = 0;
          
            $test = $this->validarCuponDevuelto(1000000000);
            $test_name = 'Prueba ' . ++$i . ' - Prueba metodo validar devolver cupon inexistente';
            $expected_result = FALSE;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->validarCuponDevuelto(-1);
            $test_name = 'Prueba ' . ++$i . ' - Prueba metodo validar devolver cupon negativo';
            $expected_result = FALSE;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->validarCuponDevuelto(8);
            $test_name = 'Prueba ' . ++$i . ' - Prueba metodo validar devolver cupon anterior a uno pagado';
            $expected_result = FALSE;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->validarCuponDevuelto(8);
            $test_name = 'Prueba ' . ++$i . ' - Prueba metodo validar devolver cupon pagado';
            $expected_result = FALSE;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->validarCuponDevuelto(7);
            $test_name = 'Prueba ' . ++$i . ' - Prueba metodo validar devolver cupon en orden';
            $expected_result = True;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->validarCuponDevuelto(9);
            $test_name = 'Prueba ' . ++$i . ' - Prueba metodo validar devolver cupon ya pagado';
            $expected_result = False;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->validarCuponDevuelto('ajsnaj');
            $test_name = 'Prueba ' . ++$i . ' - Prueba  validar tipo de dato numero de cupon';
            $expected_result = False;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->validarCuponDevuelto(-1);
            $test_name = 'Prueba ' . ++$i . ' - Prueba  validar cupon negativo';
            $expected_result = False;
        
            $this->unit->run($test, $expected_result, $test_name);
            
            
            
            //Generación Reporte de Ejecución de las Pruebas
           
            echo $this->unit->report();
        
    }

    private function validarCuponDevuelto($numeroCupon) {
        
        return ( $this->required($numeroCupon) &&
                $this->numeric($numeroCupon) &&
                $this->max_length($numeroCupon, 8) &&
                $this->notUnique($numeroCupon, 'models\M_cupon,id,integer') &&
                $this->noPagado($numeroCupon) &&
                $this->cuponOrdenado($numeroCupon) &&
                $this->xss_clean($numeroCupon) &&
                $this->cleanQuery($numeroCupon));
    }

    function numeric($str) {
        return (bool) preg_match('/^[\-+]?[0-9]*\.?[0-9]+$/', $str);
    }
    private function noPagado($cupon) {
        //Obtiene la instancia de CI y establece el mensaje en caso de error.


        $cuponDao = new \CuponDAO();
        return $cuponDao->existeCuponNoPagado($cupon);
    }

    public function cuponOrdenado($str) {


        $cuponDAO = new \CuponDAO();
        $cupon = $cuponDAO->getCuponByID($str);

        $cuponesNoPagadosSocio = $cuponDAO->getCuponesNoPagadosBySocio($cupon->getSocio()->getId());

        foreach ($cuponesNoPagadosSocio as $cuponNoPagado) {

            if ($cuponNoPagado->getFechaVencimiento() > $cupon->getFechaVencimiento())
                return FALSE;
        }

        return TRUE;
    }

    private function notUnique($str, $params) {


        return!$this->unique($str, $params);

    }
        
    private function unique($str, $params) {

        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
        $CI->form_validation->set_message('unique', 'El %s ya existe en la base de datos.');

        //Separa los 3 parametros en las variables $model, $field y $type.
        list($model, $field, $type) = explode(',', $params, 3);

        //Crea una instancia del parametro $model.
        $instance = new $model();

        //Con esta instancia, llama a la funcion existe del modelo, la cual se
        //encargará de validar si efectivamente el campo es unique. Se le pasa como
        //parametros el valor del campo, el nombre del campo y el tipo (string o
        //integer).
        $yaExiste = $instance->existe($str, $field, $type);

        //Si ya existe, retorna FALSE y la validación falla. Sino retorna TRUE.
        if ($yaExiste) {
        return FALSE;
        } 
        else {
            return TRUE;
        }
    }
    private function cleanQuery($str) {

        //Obtiene la instancia de CI y establece el mensaje en caso de error.
        $CI = & get_instance();
        $CI->form_validation->set_message('cleanQuery', 'El %s contiene caracteres inválidos.');

        //Si los caracteres especiales son automáticamente escapados, los "des-escapa".
        if (get_magic_quotes_gpc ()) {
            $str = stripslashes($str);
        }

        //Establece una conexión con la base de datos para obtener la versión de
        //PostgreSQL.
        
        $db_conn = pg_connect("host=localhost port=5432 dbname=MetodosDB user=postgres password=agu123");
        $pg_version = pg_version($db_conn);

        //Si la versión de PHP es mayor o igual a la 4.2.0 y la de PostgreSQL mayor
        //o igual a la 7.2 entonces se puede utilizar pg_escape_string, sino se utiliza
        //addslashes.
        if (phpversion() >= '4.2.0' && $pg_version['client'] >= '7.2') {
            $str = pg_escape_string($str);
        } else {
            $str = addslashes($str);
        }

        //Elimina tags HTML.
        $str = strip_tags($str);

        //Arreglo de palabras no permitidas.
        $invalidKeywords = array('select', 'from', 'where', 'union', 'insert',
            'update', 'join', 'create', 'delete');

        //Por cada palabra del arreglo, determina si aparece en la cadena. En ese caso,
        //retorna FALSE.
        for ($i = 0; $i < count($invalidKeywords); $i++) {
            $injection = stripos($str, $invalidKeywords[$i]);
            if (is_numeric($injection))
                return FALSE;
        }

        //Sino, retorna TRUE.
        return TRUE;
    }
    
    private function max_length($str, $val) {
        if (preg_match("/[^0-9]/", $val)) {
            return FALSE;
        }

        if (function_exists('mb_strlen')) {
            return (mb_strlen($str) > $val) ? FALSE : TRUE;
        }

        return (strlen($str) > $val) ? FALSE : TRUE;
    }

    private function xss_clean($str) {
        $CI = & get_instance();
        return $CI->security->xss_clean($str);
    }
    
    private function required($str) {
        if (!is_array($str)) {
            return (trim($str) == '') ? FALSE : TRUE;
        } else {
            return (!empty($str));
        }
    }

}

?>
